#include "parseprotocol.h"
#include <QString>

parseProtocol::parseProtocol(QObject *parent) :
    QObject(parent)
{
    _initValue();
}

//********************************************************************************
//函数名：void _setItemData()
//功能：设置接收数据

void parseProtocol::setItemData(const QString &data_parse)
{   
    _set68(data_parse);//->启动帧
    _setLength(data_parse);//->长度帧
    _setNodeType(data_parse);//->控制帧
}

//********************************************************************************
//函数名：void _setItemData()
//功能：设置接收数据
void parseProtocol::_initValue()
{

    _item_68=new QString();//->启动节点
    _item_length=new QString();//->解析长度
    _item_control1=new QString();//->控制节点总结点；
    _item_control11=new QString();//->控制节点1
    _item_control12=new QString();//->控制节点2
    _item_control13=new QString();//->控制节点3
    _item_control14=new QString();//->控制节点4
    _item_type=new QString();         //->类型标识
    _item_change=new QString();   //->可变结构限定词
    _item_transferreason=new QString();//->传输原因
    _item_address=new QString();//->公共地址
}

//********************************************************************************
//函数名：void pGetIC()
//功能：    //判断U I S 型  【7】=0——I 格式——返回1
//[7]=1 [6]=0    S 格式——返回2
//[7]=1 [6]=1    u格式——返回3
int parseProtocol::getIC(const QString &data_parse)
{
    //16进制——转10进制
    int tmp=data_parse.mid(c_control1,2).toInt(&ok,16);
    if(tmp%2==0)
    {
        return 1;//i
    }else
    {
        tmp=tmp>>1;
        if(tmp%2==0)
        {
            return 2;//s
        }else
        {
            return 3;//u
        }
    }
}



//********************************************************************************
//函数名：void _set68()
//功能：启动帧

void parseProtocol::_set68(const QString &data_parse)
{
    if(104==data_parse.left(2).toInt(&ok,16))
    {
        *_item_68=tr("%1——启动帧").arg(data_parse.left(2));
    }else
    {
        *_item_68=tr("%1——启动帧错误").arg(data_parse.left(2));
    }
}

//********************************************************************************
//函数名：void get68()
//功能：返回启动帧
QString parseProtocol::get68()
{
    return *_item_68;
}



//********************************************************************************
//函数名：void _setLength()
//功能：获取长度

void parseProtocol::_setLength(const QString &data_parse)
{
    *_item_length=tr("%1——长度：%2")
            .arg(data_parse.mid(c_length,2))
            .arg(data_parse.mid(c_length,2).toInt(&ok,16));
}

//********************************************************************************
//函数名：void getLength()
//功能：长度
QString parseProtocol::getLength()
{
    return *_item_length;
}

//********************************************************************************
//函数名：void _setNodeType()
//功能：I帧 U帧 S帧
void parseProtocol::_setNodeType(const QString &data_parse)
{
       int tmp=getIC(data_parse);
       if(tmp==1)
       {
           *_item_control1="控制帧——I帧";
                //->解析控制结构——控制域1
           *_item_control11=tr("%1----I格式：控制域1--LSB发送序列号N(s)bit1~bit7,bit0:0")
                   .arg(data_parse.mid(c_control1,2));

                //对control2+control1 右移1位——前两位序列号
           QString l_s_out=data_parse.mid(c_control1,2)+data_parse.mid(c_control1,2);
           int l_i_out=l_s_out.toInt(&ok,16);
                l_i_out=l_i_out>>1;

                //->解析控制结构——控制域2
           *_item_control12=tr("%1----I格式：控制域2--MSB发送序列号N(s):%2")
                   .arg(data_parse.mid(c_control2,2))
                   .arg(l_i_out);
                //->解析控制结构——控制域3
           *_item_control13=tr("%1----I格式：控制域3--LSB接收序列号N(s)bit1~bit7,bit0:0")
                   .arg(data_parse.mid(c_control3,2));

                //->对control2+control1 右移1位——后两位序列号
            l_s_out=data_parse.mid(c_control4,2)+data_parse.mid(c_control3,2);
            l_i_out=l_s_out.toInt(&ok,16);
           l_i_out=l_i_out>>1;


                //->解析控制结构——控制域4
           *_item_control14=tr("%1----I格式：控制域4--MSB发送序列号N(s):%2")
                             .arg(data_parse.mid(c_control4,2))
                             .arg(l_i_out);
       }else if(tmp==2)//S 帧
       {
           *_item_control1="控制帧----S帧";//->根节点

            //->解析控制结构——控制域1
           *_item_control11=tr("%1——S格式:控制域1--LSB发送序列号N(s)bit2~bit7,bit0:1,bit1:0")
                   .arg(data_parse.mid(c_control1,2));

             //->解析控制结构——控制域2
           *_item_control12=tr("%1——S格式:控制域2--应该为0")
                   .arg(data_parse.mid(c_control2,2));

             //->解析控制结构——控制域3
           *_item_control13=tr("%1——S格式:控制域3--LSB接收序列号N(s)bit1~bit7,bit0:")
                   .arg(data_parse.mid(c_control3,2));

           //合并字符串
          QString l_s_out=data_parse.mid(c_control4,2)+data_parse.mid(c_control3,2);
          int l_i_out=l_s_out.toInt(&ok,16);
          //右边移动
          l_i_out=l_i_out>>1;

             //->解析控制结构——控制域4
           *_item_control14=tr("%1——S格式:控制域4--MSB接收序列号N(s):%2")
                  .arg(data_parse.mid(c_control4,2))
                  .arg(l_i_out);
       }else if(tmp==3)
       {
           *_item_control1="控制帧----U帧";//->控制根

           //->解析控制结构——控制域1

           int l_i_out=data_parse.mid(c_control1,2).toInt(&ok,16);
           *_item_control11=tr("%1——u格式：控制域1--TestCon:%2,TestAct:%3,StopCon:%4,StopAct:%5,StartAct:%6,bit1:1,bit0:1")
                                                           .arg(data_parse.mid(c_control1,2))
                                                           .arg((l_i_out>>7)%2)
                                                           .arg((l_i_out>>6)%2)
                                                           .arg((l_i_out>>5)%2)
                                                           .arg((l_i_out>>4)%2)
                                                           .arg((l_i_out>>3)%2)
                                                           .arg((l_i_out>>2)%2);
           //->解析控制结构——控制域2
           *_item_control12=tr("%1——u格式：控制域2----应该为0")
                                                           .arg(data_parse.mid(c_control2,2));

           //->解析控制结构——控制域3
           *_item_control13=tr("%1——u格式：控制域3----应该为0,bit0:0")
                                                           .arg(data_parse.mid(c_control3,2));

           //->解析控制结构——控制域4
           *_item_control14=tr("%1——u格式：控制域4----应该为0")
                                                           .arg(data_parse.mid(c_control4,2));
       }
}

//********************************************************************************
//函数名：void getControl1()
//功能：控制根

QString parseProtocol::getControl1()
{
    return *_item_control1;
}

//********************************************************************************
//函数名：void getControl11()
//功能：控制根1
QString parseProtocol::getControl11()
{
    return *_item_control11;
}

//********************************************************************************
//函数名：void getControl12()
//功能：控制根2
QString parseProtocol::getControl12()
{
    return *_item_control12;
}

//********************************************************************************
//函数名：void getControl13()
//功能：控制根3
QString parseProtocol::getControl13()
{
    return *_item_control13;
}

//********************************************************************************
//函数名：void getControl14()
//功能：控制根4
QString parseProtocol::getControl14()
{
    return *_item_control14;
}






